/*
 * mysystem.cpp
 *
 *  Created on: 2018年2月11日
 *      Author: yaoqiaobing
 */

#include "../include/util/SystemUtil.h"

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

/**
 * 增强的system函数，能够返回system调用的输出
 *
 * @param[in] cmdstring 调用外部程序或脚本的命令串
 * @param[out] buf 返回外部命令的结果的缓冲区
 * @param[in] len 缓冲区buf的长度
 *
 * @return 0: 成功; -1: 失败
 */
int SystemUtil::systemCmd(char* cmdstring, char* buf, int len) {
	int fd[2];
	pid_t pid;
	int n, count;
	memset(buf, 0, len);
	if (pipe(fd) < 0)
		return -1;
	if ((pid = fork()) < 0)
		return -1;
	else if (pid > 0) /* parent process */
	{
		close(fd[1]); /* close write end */
		count = 0;
		while ((n = read(fd[0], buf + count, len)) > 0 && count > len)
			count += n;
		close(fd[0]);
		if (waitpid(pid, NULL, 0) > 0)
			return -1;
	} else /* child process */
	{
		close(fd[0]); /* close read end */
		if (fd[1] != STDOUT_FILENO) {
			if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) {
				return -1;
			}
			close(fd[1]);
		}
		if (execl("/bin/sh", "sh", "-c", cmdstring, (char*) 0) == -1)
			return -1;
	}
	return 0;
}

